package bank

import (
	"errors"
	"fmt"
)

// 定义结构体，只是在当前包下使用
type account struct {
	number  string
	balance float64
	frozen  bool
}

// 给结构体添加方法
// 存款：传递要存取的金额，返回是否存取成功
func (a *account) Deposit(amount float64) error {
	if amount <= 0 { // 如果小于0
		return fmt.Errorf("存款金额不能小于0")
	}
	// 存成功，没有错误
	a.balance += amount
	return nil
}

// 取款方法，使用指针接受者，可以修改原来的对象
func (a *account) Withdraw(amount float64) error {
	// 如果账户处于冻结状态禁止
	if a.frozen {
		return errors.New("当前账号处于冻结状态，禁止取款")
	}
	// 取款金额不能小于0
	if amount <= 0 {
		return errors.New("取款金额不能小于0")
	}
	// 取款金额不能超过余额
	if amount > a.balance {
		return errors.New("取款金额不能超过余额")
	}
	// 取款
	a.balance -= amount
	// 没有错误
	return nil
}

// 查询余额
func (a account) GetBalance() float64 {
	return a.balance
}

// 准备工厂函数（可以被外部调用），可以创建对象
func NewAccount(number string, balance float64, frozen bool) *account {
	return &account{
		number:  number,
		balance: balance,
		frozen:  frozen,
	}
}
